package com.example.springbootdemo;

import com.google.gson.Gson;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;

/**
 * Demo class
 *
 * @author cici
 * @date 2019/02/18
 */
@SpringBootApplication
public class SpringbootDemoApplication {

    public static void main(String[] args) {
//        SpringApplication.run(SpringbootDemoApplication.class, args);
//
//        Map map = new HashMap();
//
//        List<String> alpha = Arrays.asList("A", "b", "c", "d");
//
//        //Before Java8
//        List<String> alphaUpper = new ArrayList<>();
//        for (String s : alpha) {
//            alphaUpper.add(s.toUpperCase());
//        }
//        //[A, b, c, d]
//        System.out.println(alpha);
//        //[A, B, C, D]
//        System.out.println(alphaUpper);
//
//        // Java 8
//        List<String> collect = alpha.stream().map(String::toUpperCase).collect(Collectors.toList());
//        //[A, B, C, D]
//        System.out.println(collect);
//
//        // Extra, streams apply to any data type.
//        List<Integer> num = Arrays.asList(1,2,3,4,5);
//        List<Integer> collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
//        //[2, 4, 6, 8, 10]
//        System.out.println(collect1);
//        List list = new ArrayList();
//        list.add("qqyumidi");
//        list.add("corn");
////        list.add(100);
//        for (int i = 0; i < list.size(); i++) {
//            String name = (String) list.get(i);
//            System.out.println("name:" + name);
//            }
//
//
//        // 基本类型包括：byte,char,int short,long,float,double,boolean;
//        // 引用类型包括：类类型，接口类型和数组
//
//        //基本类型形参不影响实参
//        //实参
//        int i = 1;
//        System.out.println(i);
//        //形参，函数的参数
//        int j = test(i);
//        System.out.println(j);
//        System.out.println(i);
//
//        //引用数据类型形参影响实参
//        //实参
//        entity e = new entity();
//        e.setA(10);
//        System.out.println(e.getA());
//        entity f = test1(e);
//        System.out.println(e.getA());
//        System.out.println(f.getA());
//
//
//        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
//        //map 就是把一个function计算出来的值映射出来
//        List<Integer> nums =  numbers.stream().map(s -> s*s).distinct().collect(Collectors.toList());
//        System.out.println(nums.toString());
//
//        List<test> lists = new ArrayList<>();
//        test t = new test();
//        t.setId(1);
//        t.setName("cici");
//        t.setPoint(BigDecimal.valueOf(90.00));
//        t.setSubject("语文");
//
//        test t1 = new test();
//        t1.setId(2);
//        t1.setName("cici");
//        t1.setPoint(BigDecimal.valueOf(91));
//        t1.setSubject("数学");
//
//        test t2 = new test();
//        t2.setId(3);
//        t2.setName("lili");
//        t2.setPoint(BigDecimal.valueOf(92.1));
//        t2.setSubject("数学");
//        lists.add(t);
//        lists.add(t2);
//
//        //根据特定的字段进行分组
//        Map<String,List<test>> result = lists.stream().collect(Collectors.groupingBy(test::getName));
//        System.out.println(new Gson().toJson(result));
//
////        BigDecimal b = lists.stream().map(A ->A.getPoint()).collect(Collectors.averagingDouble());
////        System.out.println(b);
//
//        List<String> s = lists.stream().map(c ->c.getName() + "A").collect(Collectors.collectingAndThen(toList(),Collections::unmodifiableList));
//        System.out.println(s.toString());
//
//        Optional<BigDecimal> x = lists.stream().map(a -> a.getPoint()).reduce(BigDecimal::add);
//        System.out.println(x);
//    }
//
//    private static entity test1(entity e) {
//        e.setA(9);
//        return e;
//    }
//
//    private static int test(int i) {
//        return i+1;
//    }
//
//    //六种基本数据类型的包装类是为了方便引用传递，也为了防止内存溢出，普通的数据类型是在栈堆上创建，而对象类型是在堆上创建的
//    //引用数据类型包括对象和数组
//    //基本数据类型和引用数据类型的形参实参关系在上面证实了
//
//
//    //java面向对象的特性  继承，多态，封装
//    //继承的表现形式，抽象类，接口，类继承
//    //多态的表现形式，重载和重写
//    //封装，就是实体类
//    //三目运算符（）？x:y     ()里是布尔值，true则x,false则y
//
//    //泛型的应用，模仿一下mybatis封装的增删查改
//
//
//    //Stream的API https://www.cnblogs.com/yuanbing1226/p/9005476.html
//    //Collecter的API https://www.cnblogs.com/yuanbing1226/p/9005476.html

    }
}
